home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / ASM / TRX.a < prev    next >
Encoding:
Text File  |  2001-09-16  |  8.8 KB  |  480 lines

  1. *******************************************************
  2. **      XFD external decruncher for TRX-Cruncher     **
  3. **         written and © 2000 by Georg Hörmann       **
  4. *******************************************************
  5. **
  6. ** 1.00    - Initial release.
  7. **
  8. *******************************************************
  9. **
  10. ** NOTE: The RAW and RAWB formats will be transformed
  11. **     to plain IFF-ILBM files (uncompressed!).
  12. **
  13.  
  14.         OUTPUT    "LIBS:xfd/TRX"
  15.  
  16.         INCDIR    "dh0:Include_Asm"    ;change this as you need it
  17.         INCLUDE    "libraries/xfdmaster.i"
  18.         INCLUDE    "graphics/view.i"
  19.  
  20. *******************************************************
  21.  
  22.         moveq    #-1,d0        ;security
  23.         rts
  24.         dc.l    XFDF_ID        ;id
  25.         dc.w    1        ;version
  26.         dc.w    0
  27.         dc.l    0,0        ;private
  28.         dc.l    S_TRX        ;first slave
  29.  
  30.         dc.b    "$VER: TRX 1.00 (08.01.2000)",0
  31.  
  32. N_TRX        dc.b    "TRX-Cruncher",0
  33.         even
  34.  
  35. *******************************************************
  36.  
  37. S_TRX        dc.l    0        ;no more slaves
  38.         dc.w    2        ;version
  39.         dc.w    39        ;master version
  40.         dc.l    N_TRX        ;name
  41.         dc.w    XFDPFF_DATA|XFDPFF_RECOGLEN|XFDPFF_USERTARGET
  42.         dc.w    0
  43.         dc.l    RB_TRX        ;recog buffer
  44.         dc.l    DB_TRX        ;decrunch buffer
  45.         dc.l    0        ;recog segment
  46.         dc.l    0        ;decrunch segment
  47.         dc.w    0,0
  48.         dc.l    $bc+2
  49.  
  50. ;-------------------------------------------------
  51.  
  52. RB_TRX        moveq    #0,d0
  53.         cmp.l    #"TRX ",(a0)+
  54.         bne    .Exit
  55.         cmp.l    #"V2.5",(a0)+
  56.         bne.s    .Exit
  57.  
  58.         bsr.s    .GetLong    ;cr len
  59.         add.l    #$bc,d1
  60.         move.l    d1,xfdrr_MinSourceLen(a1)
  61.  
  62.         bsr.s    .GetLong    ;uncr len
  63.         move.l    d1,xfdrr_MinTargetLen(a1)
  64.         move.l    d1,xfdrr_FinalTargetLen(a1)
  65.  
  66.         bsr.s    .GetLong    ;type
  67.         cmp.l    #"CODE",d1
  68.         beq.s    .Ok
  69.         cmp.l    #"MOD ",d1
  70.         beq.s    .Ok
  71.         cmp.l    #"IFF ",d1
  72.         beq.s    .Ok
  73.         cmp.l    #"TEXT",d1
  74.         beq.s    .Ok
  75.         cmp.l    #"SND ",d1
  76.         beq.s    .Ok
  77.         cmp.l    #"SIN ",d1
  78.         beq.s    .Ok
  79.         cmp.l    #"LIST",d1
  80.         beq.s    .Ok
  81.  
  82.         cmp.l    #"RAW ",d1
  83.         beq.s    .Raw
  84.         cmp.l    #"RAWB",d1
  85.         bne.s    .Exit
  86. .Raw        addq.w    #4,a0
  87.         bsr.s    .GetWord    ;depth
  88.         cmp.w    #5,d1
  89.         ble.s    .DepthOk
  90.         moveq    #5,d1        ;supports only 32 colours !!
  91. .DepthOk    moveq    #0,d0
  92.         bset    d1,d0
  93.         mulu    #3,d0    ;length of CMAP chunk
  94.         add.w    #68,d0    ;FORM,x,ILBM,BMHD,x,20 Bytes,CMAP,x,CAMG,x,4 Bytes,BODY,x
  95.         add.l    d0,xfdrr_MinTargetLen(a1)
  96.         add.l    d0,xfdrr_FinalTargetLen(a1)
  97.  
  98. .Ok        moveq    #1,d0
  99. .Exit        rts
  100.  
  101. .GetLong    move.b    (a0)+,d1
  102.         rol.b    #1,d1
  103.         lsl.w    #8,d1
  104.         move.b    (a0)+,d1
  105.         rol.b    #1,d1
  106.         lsl.l    #8,d1
  107. .GetWord    move.b    (a0)+,d1
  108.         rol.b    #1,d1
  109.         lsl.l    #8,d1
  110.         move.b    (a0)+,d1
  111.         rol.b    #1,d1
  112.         rts
  113.  
  114. ;-------------------------------------------------
  115.  
  116.         rsreset
  117. TRX_CrLen    rs.l    1
  118. TRX_UncrLen    rs.l    1
  119. TRX_Type    rs.l    1
  120. TRX_Width    rs.w    1
  121. TRX_Height    rs.w    1
  122. TRX_Depth    rs.w    1
  123. TRX_Modulo    rs.w    1    ;unused
  124. TRX_Resolution    rs.l    1
  125. TRX_InterlaceFlag rs.l    1
  126. TRX_HAMFlag    rs.l    1
  127. TRX_EHBFlag    rs.l    1
  128. TRX_Colors    rs.w    32
  129. TRX_SIZE    =    __RS
  130.  
  131. DB_TRX        movem.l    d2-d7/a2-a6,-(a7)
  132.         sub.w    #TRX_SIZE,a7
  133.         move.l    a7,a4
  134.         move.l    a0,a5
  135.  
  136. * extract information from header
  137.  
  138.         move.l    xfdbi_SourceBuffer(a5),a0
  139.         move.l    a4,a1
  140.         addq.w    #8,a0
  141.         moveq    #20-1,d1
  142. .Copy1        move.b    (a0)+,d0
  143.         rol.b    #1,d0
  144.         move.b    d0,(a1)+
  145.         dbf    d1,.Copy1
  146.         add.w    #12,a0
  147.         moveq    #16-1,d1
  148. .Copy2        move.b    (a0)+,d0
  149.         rol.b    #1,d0
  150.         move.b    d0,(a1)+
  151.         dbf    d1,.Copy2
  152.         add.w    #64,a0
  153.         moveq    #64-1,d1
  154. .Copy4        move.b    (a0)+,d0
  155.         rol.b    #1,d0
  156.         move.b    d0,(a1)+
  157.         dbf    d1,.Copy4
  158.  
  159. * create ILBM header if necessary
  160.  
  161.         moveq    #0,d7        ;no IFF header
  162.         cmp.l    #"RAW ",TRX_Type(a4)
  163.         beq.s    .Raw
  164.         cmp.l    #"RAWB",TRX_Type(a4)
  165.         bne    .PlainCrunched
  166.  
  167. .Raw        moveq    #68,d7    ;FORM,x,ILBM,BMHD,x,20 Bytes,CMAP,x,CAMG,x,4 Bytes,BODY,x
  168.         move.w    TRX_Depth(a4),d0
  169.         cmp.w    #5,d0
  170.         ble.s    .DepthOk
  171.         moveq    #5,d0
  172. .DepthOk    moveq    #0,d6
  173.         bset    d0,d6
  174.         mulu    #3,d6        ;length of CMAP
  175.         add.l    d6,d7        ;length of IFF header
  176.  
  177.         move.l    xfdbi_UserTargetBuf(a5),a1
  178.         move.l    #"FORM",(a1)+
  179.         move.l    xfdbi_TargetBufSaveLen(a5),d0
  180.         subq.l    #8,d0
  181.         move.l    d0,(a1)+
  182.         move.l    #"ILBM",(a1)+
  183.  
  184.         move.l    #"BMHD",(a1)+
  185.         move.l    #20,(a1)+
  186.         move.w    TRX_Width(a4),(a1)+
  187.         move.w    TRX_Height(a4),(a1)+
  188.         clr.l    (a1)+
  189.         moveq    #0,d0
  190.         move.w    TRX_Depth(a4),d0
  191.         ror.l    #8,d0
  192.         move.l    d0,(a1)+        ;no compression!
  193.         clr.w    (a1)+
  194.         move.w    TRX_Width(a4),d0    ;get aspect x,y
  195.         move.w    TRX_Height(a4),d1
  196.         cmp.w    #320,d0
  197.         bne.s    .Aspect640
  198.         move.w    #$0a0b,d2    ;320x200
  199.         cmp.w    #200,d1
  200.         beq.s    .SetAspect
  201.         cmp.w    #256,d1
  202.         beq.s    .SetAspect
  203.         move.w    #$140b,d2    ;320x400
  204.         cmp.w    #400,d1
  205.         beq.s    .SetAspect
  206.         cmp.w    #512,d1
  207.         beq.s    .SetAspect
  208.         bra.s    .NoAspect
  209. .Aspect640    cmp.w    #640,d0
  210.         bne.s    .NoAspect
  211.         move.w    #$050b,d2    ;640x200
  212.         cmp.w    #200,d1
  213.         beq.s    .SetAspect
  214.         cmp.w    #256,d1
  215.         beq.s    .SetAspect
  216.         move.w    #$0a0b,d2    ;640x400
  217.         cmp.w    #400,d1
  218.         beq.s    .SetAspect
  219.         cmp.w    #512,d1
  220.         beq.s    .SetAspect
  221. .NoAspect    moveq    #0,d2
  222. .SetAspect    move.w    d2,(a1)+
  223.         move.l    -16(a1),(a1)+
  224.  
  225.         move.l    #"CMAP",(a1)+
  226.         move.l    d6,(a1)+
  227.         lea    TRX_Colors(a4),a0
  228. .NextColor    move.b    (a0)+,d0
  229.         lsl.b    #4,d0
  230.         move.b    d0,(a1)+
  231.         move.b    (a0),d0
  232.         and.b    #$f0,d0
  233.         move.b    d0,(a1)+
  234.         move.b    (a0)+,d0
  235.         lsl.b    #4,d0
  236.         move.b    d0,(a1)+
  237.         subq.w    #3,d6
  238.         bne.s    .NextColor
  239.  
  240.         move.l    #"CAMG",(a1)+
  241.         move.l    #4,(a1)+
  242.         moveq    #0,d2
  243.         move.b    TRX_Resolution(a4),d0
  244.         cmp.b    #"L",d0
  245.         beq.s    .LoRes
  246.         cmp.b    #"H",d0
  247.         beq.s    .HiRes
  248.         or.w    #V_SUPERHIRES,d2
  249.         bra.s    .LoRes
  250. .HiRes        or.w    #V_EXTENDED_MODE|V_HIRES,d2
  251. .LoRes        cmp.w    #"ON",TRX_InterlaceFlag(a4)
  252.         bne.s    .NoLace
  253.         or.w    #V_LACE,d2
  254. .NoLace        cmp.w    #"ON",TRX_HAMFlag(a4)
  255.         bne.s    .NoHAM
  256.         or.w    #V_HAM,d2
  257. .NoHAM        cmp.w    #"ON",TRX_EHBFlag(a4)
  258.         bne.s    .NoEHB
  259.         or.w    #V_EXTRA_HALFBRITE,d2
  260. .NoEHB        move.l    d2,(a1)+
  261.  
  262.         move.l    #"BODY",(a1)+
  263.         move.l    TRX_UncrLen(a4),(a1)
  264.  
  265. * decrunch data
  266.  
  267. .PlainCrunched    move.l    xfdbi_SourceBuffer(a5),a0
  268.         add.w    #$bc,a0
  269.         add.l    TRX_CrLen(a4),a0
  270.         move.l    -(a0),d0        ;should be uncr len
  271.         cmp.l    TRX_UncrLen(a4),d0
  272.         beq.s    .Decr
  273.         move.w    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  274.         moveq    #0,d0
  275.         bra.s    .Exit
  276.  
  277. .Decr        move.l    xfdbi_UserTargetBuf(a5),a1
  278.         move.l    a1,a2
  279.         add.l    d7,a2
  280.         add.l    xfdbi_TargetBufSaveLen(a5),a1
  281.         bsr    Decr_TRX
  282.         tst.w    d0
  283.         beq.s    .Exit
  284.  
  285.         cmp.l    #"RAW ",TRX_Type(a4)
  286.         bne.s    .Exit
  287.         bsr.s    Scramble_RAW
  288.  
  289. .Exit        add.w    #TRX_SIZE,a7
  290.         movem.l    (a7)+,d2-d7/a2-a6
  291.         rts
  292.  
  293. * convert raw to iff format (= sorted by lines, not by planes)
  294. * -> needs second buffer, I have no idea how to avoid this :-(
  295.  
  296. Scramble_RAW    move.l    xfdm_ExecBase(a6),a6
  297.         move.l    TRX_UncrLen(a4),d0
  298.         moveq    #1,d1
  299.         jsr    -198(a6)
  300.         tst.l    d0
  301.         beq.s    .Error
  302.         move.l    d0,a3
  303.  
  304.         moveq    #0,d3
  305.         move.w    TRX_Width(a4),d3
  306.         lsr.w    #3,d3            ;bytes per line
  307.  
  308.         moveq    #0,d4
  309.         move.w    TRX_Height(a4),d4
  310.         mulu    d3,d4            ;planesize
  311.  
  312.         move.l    d4,d5
  313.         mulu    TRX_Depth(a4),d5
  314.         sub.l    d3,d5            ;jump back after each line
  315.  
  316.         move.l    xfdbi_UserTargetBuf(a5),a0
  317.         add.l    d7,a0            ;start of data
  318.         move.l    a3,a1
  319.  
  320.         move.w    TRX_Height(a4),d2
  321.         subq.w    #1,d2
  322. .AllLines    move.w    TRX_Depth(a4),d1
  323.         subq.w    #1,d1
  324. .CopyPlanes    move.w    d3,d0
  325.         subq.w    #1,d0
  326. .CopyLine    move.b    (a0)+,(a1)+
  327.         dbf    d0,.CopyLine
  328.         sub.w    d3,a0
  329.         add.l    d4,a0
  330.         dbf    d1,.CopyPlanes
  331.         sub.l    d5,a0
  332.         dbf    d2,.AllLines
  333.  
  334.         move.l    a3,a0
  335.         move.l    xfdbi_UserTargetBuf(a5),a1
  336.         add.l    d7,a1
  337.         move.l    TRX_UncrLen(a4),d0
  338.         jsr    -624(a6)
  339.  
  340.         move.l    a3,a1
  341.         move.l    TRX_UncrLen(a4),d0
  342.         jsr    -210(a6)
  343.         moveq    #1,d0
  344.         rts
  345.  
  346. .Error        move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  347.         moveq    #0,d0
  348.         rts
  349.  
  350. ;=================================================
  351.  
  352. * -> a0: end of source data
  353. * -> a1: end of target buffer
  354. * -> a2: start of target buffer
  355. * <- d0: result
  356.  
  357. Decr_TRX    move.l    -(a0),d0
  358. .l6F92        moveq    #3,d1
  359.         bsr    .l70A6
  360.         tst.b    d2
  361.         beq.s    .l6FEC
  362.         cmp.w    #7,d2
  363.         bne.s    .l6FC6
  364.         lsr.l    #1,d0
  365.         bne.s    .l6FAA
  366.         move.l    -(a0),d0
  367.         roxr.l    #1,d0
  368. .l6FAA        bcc.s    .l6FBE
  369.         moveq    #10,d1
  370.         bsr.s    .l70A6
  371.         tst.b    d2
  372.         bne.s    .l6FC6
  373.         moveq    #$12,d1
  374.         bsr.s    .l70A6
  375.         bra.s    .l6FC6
  376.  
  377. .l6FBE        moveq    #4,d1
  378.         bsr.s    .l70A6
  379.         addq.w    #7,d2
  380. .l6FC6        move.l    a1,a3        ;security check !
  381.         sub.l    d2,a3        ;
  382.         cmp.l    a2,a3        ;
  383.         bcs    .Error        ;
  384.         subq.l    #1,d2
  385. .l6FC8        moveq    #7,d1
  386. .l6FCA        lsr.l    #1,d0
  387.         bne.s    .l6FDC
  388.         move.l    -(a0),d0
  389.         roxr.l    #1,d0
  390. .l6FDC        roxl.b    #1,d3
  391.         dbra    d1,.l6FCA
  392.         move.b    d3,-(a1)
  393.         dbra    d2,.l6FC8
  394.  
  395. .l6FEC        cmp.l    a2,a1
  396.         bne.s    .Cont
  397.         moveq    #1,d0
  398.         rts
  399.  
  400. .Cont        moveq    #2,d1
  401.         bsr.s    .l70A6
  402.         moveq    #2,d3
  403.         moveq    #8,d1
  404.         tst.w    d2
  405.         beq.s    .l705C
  406.         moveq    #4,d3
  407.         cmp.w    #2,d2
  408.         beq.s    .l7046
  409.         moveq    #3,d3
  410.         cmp.w    #1,d2
  411.         beq.s    .l7038
  412.         moveq    #2,d1
  413.         bsr.s    .l70A6
  414.         cmp.w    #3,d2
  415.         beq.s    .l7030
  416.         cmp.w    #2,d2
  417.         beq.s    .l7026
  418.         addq.w    #5,d2
  419.         move.w    d2,d3
  420.         bra.s    .l7046
  421.  
  422. .l70A6        subq.w    #1,d1
  423.         moveq    #0,d2
  424. .l70AA        lsr.l    #1,d0
  425.         bne.s    .l70B6
  426.         move.l    -(a0),d0
  427.         roxr.l    #1,d0
  428. .l70B6        roxl.w    #1,d2
  429.         dbra    d1,.l70AA
  430.         rts
  431.  
  432. .l7026        moveq    #2,d1
  433.         bsr.s    .l70A6
  434.         addq.w    #7,d2
  435.         move.w    d2,d3
  436.         bra.s    .l7046
  437.  
  438. .l7030        moveq    #8,d1
  439.         bsr.s    .l70A6
  440.         move.w    d2,d3
  441.         bra.s    .l7046
  442.  
  443. .l7038        moveq    #8,d1
  444.         lsr.l    #1,d0
  445.         bne.s    .l7040
  446.         move.l    -(a0),d0
  447.         roxr.l    #1,d0
  448. .l7040        bcs.s    .l705C
  449.         moveq    #14,d1
  450.         bra.s    .l705C
  451.  
  452. .l7046        moveq    #$10,d1
  453.         lsr.l    #1,d0
  454.         bne.s    .l704E
  455.         move.l    -(a0),d0
  456.         roxr.l    #1,d0
  457. .l704E        bcc.s    .l705C
  458.         moveq    #8,d1
  459.         lsr.l    #1,d0
  460.         bne.s    .l7058
  461.         move.l    -(a0),d0
  462.         roxr.l    #1,d0
  463. .l7058        bcs.s    .l705C
  464.         moveq    #12,d1
  465. .l705C        bsr.s    .l70A6
  466.         move.l    a1,a3        ;security check !
  467.         sub.w    d3,a3        ;
  468.         cmp.l    a2,a3        ;
  469.         bcs.s    .Error        ;
  470.         subq.w    #1,d3
  471. .l7060        move.b    -1(a1,d2.l),-(a1)
  472.         dbra    d3,.l7060
  473.         bra    .l6F92
  474.  
  475. .Error        move.w    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  476.         moveq    #0,d0
  477.         rts
  478.  
  479.         END
  480.